まずは演習環境を整えます.
ここでは二つの拡張パッケージ,「RCurl」「ggplot2」をインストールします.
RCurl( https://cran.r-project.org/web/packages/RCurl/index.html ) は R に HTTP クライアント機能を追加する拡張パッケージです. R から直接ウェブページと取得する等の操作が可能となります.
ggplot2( http://ggplot2.org/ ) はグラフ描画機能を強化する拡張パッケージです. カラフルなグラフを比較的容易に描くことができます.
それでは早速インストールしてみましょう.
以下のコマンドで拡張パッケージをインストールします.
install.packages("RCurl")
「install.packages」は拡張パッケージをインストールするための関数です.指定した名前の拡張パッケージをCRANから探し出してインストールします.
「RCurl」パッケージを読み込みます.
library(RCurl)
拡張パッケージの読み込みはRセッション毎に必要です.
以上で「RCurl」のインストールは完了です.
なお,拡張パッケージのインストールと読み込みを実行するスクリプトは以下のとおりです.
if(!require(RCurl)){ # 拡張パッケージはインストールされているか?
# 拡張パッケージのインストール
install.packages("RCurl")
# 拡張パッケージの読み込み
library(RCurl)
}## Loading required package: RCurl
## Loading required package: bitops
以下のコマンドで拡張パッケージをインストールします.
install.packages("ggplot2")
「ggplot2」パッケージを読み込みます.
library(ggplot2)
以上で「ggplot2」のインストールは完了です.
なお,拡張パッケージのインストールと読み込みを実行するスクリプトは以下のとおりです.
if(!require(ggplot2)){ # 拡張パッケージはインストールされているか?
# 拡張パッケージのインストール
install.packages("ggplot2")
# 拡張パッケージの読み込み
library(ggplot2)
}## Loading required package: ggplot2
今回は「HEALTH.DATA.NY.GOV」で公開されている Baby Names: Beginning 2007 というデータセットを使います.
このデータセットはニューヨーク州で出生した赤ちゃんの名前の統計データです.2007年から2013年までの郡ごとに集められたデータが収録されています.
ニューヨーク州の郡,New York Counties by André Koehne and DEIDATVM,https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/New_York_Counties.svg/500px-New_York_Counties.svg.png
HEALTH.DATA.NY.GOV でも加工したり,グラフを描いたりすることができます(最近はこうしたサイトが増えています).
Baby Names: Beginning 2007
それでは早速Rにオープンデータを読み込んでみましょう.
URL「 https://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv?accessType=DOWNLOAD 」から直接データを読み込みます.
#URLからのデータ読み込み
tmp <- getURL(url="https://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv?accessType=DOWNLOAD",ssl.verifypeer = FALSE)
読み込み結果がオブジェクト「tmp」に代入されます.
読み込んだ内容を表示してみましょう.
head(tmp)
ズラッとデータが表示されます.
「getURL」はRCurlパッケージに含まれる関数です.指定したURLからファイルをダウンロードする機能を有します.
オプション「ssl.verifypeer=FALSE」はSSL証明書の検証手順を省略するためのオプションです.
文字コードを指定する場合は「.encoding」オプションを指定します. データ読み込み時に文字化けが発生する場合などに用います.
例えば,ダウンロードするファイルの文字コードが Shift-JIS とわかっている場合は以下のように getURL を呼び出します.
# Shift-JIS(CP932)をダウンロードする
tmp<-getURL("http://www.tepco.co.jp/forecast/html/images/juyo-j.csv",.encoding="cp932",.mapUnicode = FALSE)
読み込んだ文字コードを別の文字コードに変換する場合は iconv を使います.
# Shift-JIS(CP932)からUTF8に変換する.
tmp2<-iconv(tmp,from="cp932",to="utf8")
head はデータの先頭を表示する関数です.
head(iris)## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
詳しい使い方についてはヘルプ,ウェブリソースを参照してください.
ヘルプは help コマンドで呼び出せます.
help(getURL)
または
?getURL
data.frame は表形式のデータ構造です.「習うよりは慣れろ」のポリシーで 先程読み込んだオープンデータを data.frame に変換してみましょう.
#CSV形式での読み込み
data <- read.csv(text=tmp)
「read.csv」はデフォルトパッケージに含まれる関数で CSV ファイルや文字列を data.frame として読み込む機能を有します.
ちなみにファイルからデータを読み込む場合には以下のように指定します.
#CSVファイルの読み込み
data <- read.csv(file="day01/Baby_Names__Beginning_2007.csv")つぎに data.frame 変換後のデータ内容を確認してみましょう.
まずはデータの先頭行を確認します.
#データの確認(先頭数行のみ)
head(data)## Year First.Name County Sex Count
## 1 2013 DAVID KINGS M 272
## 2 2013 JAYDEN KINGS M 268
## 3 2013 JAYDEN QUEENS M 219
## 4 2013 MOSHE KINGS M 219
## 5 2013 ETHAN QUEENS M 216
## 6 2013 SOPHIA QUEENS F 204
データの構造を表示します.
str(data)## 'data.frame': 43890 obs. of 5 variables:
## $ Year : int 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
## $ First.Name: Factor w/ 1638 levels "AADEN","AALIYAH",..: 424 780 780 1194 546 1469 410 720 544 546 ...
## $ County : Factor w/ 61 levels "ALBANY","ALLEGANY",..: 23 23 40 23 40 40 40 23 23 23 ...
## $ Sex : Factor w/ 2 levels "F","M": 2 2 2 2 2 1 2 2 1 2 ...
## $ Count : int 272 268 219 219 216 204 203 202 196 196 ...
データの要約を確認します.
#データの概要
summary(data)## Year First.Name County Sex
## Min. :2007 EMMA : 284 KINGS : 4957 F:20509
## 1st Qu.:2008 JACOB : 284 SUFFOLK : 4005 M:23381
## Median :2010 LOGAN : 270 NASSAU : 3548
## Mean :2010 OLIVIA : 268 QUEENS : 3376
## 3rd Qu.:2012 ISABELLA: 259 WESTCHESTER: 2941
## Max. :2013 SOPHIA : 249 ERIE : 2557
## (Other) :42276 (Other) :22506
## Count
## Min. : 5.00
## 1st Qu.: 7.00
## Median : 11.00
## Mean : 18.62
## 3rd Qu.: 20.00
## Max. :297.00
##
データの行・列サイズを確認します.
#行・列サイズの確認
dim(data)## [1] 43890 5
列名を確認してみましょう.
#オープンデータの列名確認
colnames(data)## [1] "Year" "First.Name" "County" "Sex" "Count"
行名を表示する rownames もあります.
data.frame のアクセス手法は色々とあります.
たとえば,添字を使って1行目を取り出すには以下のようにします.
data[1,]## Year First.Name County Sex Count
## 1 2013 DAVID KINGS M 272
2行目を取り出すには,
data[2,]## Year First.Name County Sex Count
## 2 2013 JAYDEN KINGS M 268
1〜5行目を取り出すには,
data[1:5,]## Year First.Name County Sex Count
## 1 2013 DAVID KINGS M 272
## 2 2013 JAYDEN KINGS M 268
## 3 2013 JAYDEN QUEENS M 219
## 4 2013 MOSHE KINGS M 219
## 5 2013 ETHAN QUEENS M 216
1,3,5行目を取り出すには,
data[c(1,3,5),]## Year First.Name County Sex Count
## 1 2013 DAVID KINGS M 272
## 3 2013 JAYDEN QUEENS M 219
## 5 2013 ETHAN QUEENS M 216
とします.
最終行から10行を取り出すには, 行数を求める nrow 関数を用いて以下のようにします.
#data.frameの行数を求める
x<-nrow(data)
data[(x-10):x,]## Year First.Name County Sex Count
## 43880 2007 ZACHARY CHENANGO M 5
## 43881 2007 ZACHARY OSWEGO M 5
## 43882 2007 ZACHARY RENSSELAER M 5
## 43883 2007 ZACHARY ST LAWRENCE M 5
## 43884 2007 ZACHARY ULSTER M 5
## 43885 2007 ZACHARY WASHINGTON M 5
## 43886 2007 ZACHARY WAYNE M 5
## 43887 2007 ZACKARY ERIE M 5
## 43888 2007 ZISSY ROCKLAND F 5
## 43889 2007 ZOE ALBANY F 5
## 43890 2007 ZOE ULSTER F 5
列も同じように添字を指定して取り出すことができます.大量のデータが表示されるので head で絞っています.
head(data[,1])## [1] 2013 2013 2013 2013 2013 2013
ただ,data.frameの場合,列名が付けられていることが殆どであるため, 通常は列名をつかって値を取り出します.
head(data$Year)## [1] 2013 2013 2013 2013 2013 2013
data.frame の操作方法がなんとなく理解できたでしょうか.
data.frameは頻繁に登場するデータ構造となるので理解を深めておいてください.
データについてはsummary関数である程度把握できたかと思いますが,もう少し細かくデータを見ていきましょう.
データについて性別の内訳を確認してみます.
table(data$Sex)##
## F M
## 20509 23381
table はデフォルトパッケージに含まれるクロス集計機能を有する関数です.
つぎに調査年毎のデータ数を確認してみます.
table(data$Year)##
## 2007 2008 2009 2010 2011 2012 2013
## 6367 6481 6312 6192 6216 6164 6158
調査年毎の性別の内訳を確認してみます.
#クロス集計(性別・年毎)
table(data$Sex,data$Year)##
## 2007 2008 2009 2010 2011 2012 2013
## F 3002 3039 2917 2925 2918 2872 2836
## M 3365 3442 3395 3267 3298 3292 3322
table 関数を用いると,data.frameの集計が手軽にできます.
クロス集計結果をグラフにしてみましょう.グラフの作成にはggplotパッケージを用います.
性別毎の集計結果を棒グラフにします.x軸は性別,y軸は集計結果とします.
table(data$Sex)##
## F M
## 20509 23381
#クロス集計結果をデータフレームに変換
tbl <- data.frame(table(data$Sex))
#確認
tbl## Var1 Freq
## 1 F 20509
## 2 M 23381
#列名の設定
names(tbl) <- c("Sex","Total")
#確認
tbl## Sex Total
## 1 F 20509
## 2 M 23381
#各列の確認
tbl$Sex## [1] F M
## Levels: F M
tbl$Total## [1] 20509 23381
#棒グラフの描画(x軸は性別,y軸は集計結果)
ggplot(data = tbl,mapping = aes(x=Sex,y=Total))+geom_bar(stat="identity")ヒント:調査年毎の集計表はtable(data$Year)で作れます.
ヒント:郡(County)毎の集計表はtable(data$County)で作れます.
theme関数のaxis.text.xオプションを使ってX軸ラベルを回転させます.
#クロス集計結果をデータフレームに変換
tbl <- data.frame(table(data$County))
#列名の設定
names(tbl) <- c("County","Total")
#グラフの描画
ggplot(tbl,aes(x=County,y=Total))+geom_bar(stat="identity")+theme(axis.text.x = element_text(angle = 90, hjust = 1))tbl<-data.frame(table(data$Sex,data$Year))
colnames(tbl)<-c("Sex","Year","Total")
ggplot(tbl,aes(x=Year,y=Total,fill=Sex))+geom_bar(stat="identity")ggplotの結果もオブジェクトに格納することができます.オブジェクトに格納することで,グラフを調整しながら作ることができます.
#クロス集計
table(data$County,data$Sex) ##
## F M
## ALBANY 319 495
## ALLEGANY 9 25
## BRONX 1120 1273
## BROOME 201 371
## CATTARAUGUS 52 118
## CAYUGA 44 101
## CHAUTAUQUA 109 228
## CHEMUNG 49 131
## CHENANGO 17 23
## CLINTON 44 78
## COLUMBIA 12 32
## CORTLAND 15 15
## DELAWARE 5 17
## DUTCHESS 310 519
## ERIE 1278 1279
## ESSEX 5 4
## FRANKLIN 9 31
## FULTON 19 39
## GENESEE 31 50
## GREENE 10 16
## HERKIMER 34 64
## JEFFERSON 223 396
## KINGS 2517 2440
## LEWIS 2 6
## LIVINGSTON 23 37
## MADISON 33 78
## MONROE 1097 1169
## MONTGOMERY 13 40
## NASSAU 1907 1641
## NEW YORK 1228 1234
## NIAGARA 272 412
## ONEIDA 283 430
## ONONDAGA 660 787
## ONTARIO 85 162
## ORANGE 706 852
## ORLEANS 8 11
## OSWEGO 117 254
## OTSEGO 11 24
## PUTNAM 81 145
## QUEENS 1733 1643
## RENSSELAER 165 320
## RICHMOND 275 407
## ROCKLAND 640 809
## SARATOGA 294 453
## SCHENECTADY 173 327
## SCHOHARIE 3 10
## SCHUYLER 0 1
## SENECA 8 12
## ST LAWRENCE 100 185
## STEUBEN 76 155
## SUFFOLK 2164 1841
## SULLIVAN 35 85
## TIOGA 14 19
## TOMPKINS 36 80
## ULSTER 162 305
## WARREN 29 66
## WASHINGTON 24 60
## WAYNE 82 152
## WESTCHESTER 1531 1410
## WYOMING 7 11
## YATES 0 3
#クロス集計結果をデータフレームに変換
tbl <- data.frame(table(data$County,data$Sex))
#列名の設定
names(tbl) <- c("County","Sex","Total")#グラフ作成(x軸は郡,y軸は集計数,塗色は性別毎,x軸ラベルは縦)
g <- ggplot(tbl,aes(x=County,y=Total,fill=Sex))+geom_bar(stat="identity")
#グラフ描画
gX軸ラベルを回転させます.
#X軸ラベル回転
g <- g+theme(axis.text.x = element_text(angle = 90, hjust = 1))
#グラフ描画
gグラフタイトルをつけます.
#グラフタイトル
g <- g+ggtitle("number of children in countries")
g#クロス集計
tbl <- table(data$First.Name)#上位10位の表示
sort(tbl,decreasing=TRUE)[1:10]##
## EMMA JACOB LOGAN OLIVIA ISABELLA SOPHIA NOAH MASON
## 284 284 270 268 259 249 247 245
## ETHAN AVA
## 239 234
dat<-data.frame(sort(tbl,decreasing=TRUE)[1:10])
colnames(dat)<-c("total")dat$name<-rownames(dat)
dat## total name
## EMMA 284 EMMA
## JACOB 284 JACOB
## LOGAN 270 LOGAN
## OLIVIA 268 OLIVIA
## ISABELLA 259 ISABELLA
## SOPHIA 249 SOPHIA
## NOAH 247 NOAH
## MASON 245 MASON
## ETHAN 239 ETHAN
## AVA 234 AVA
g<-ggplot(dat,aes(x=name,y=total))+geom_bar(stat="identity")
g#人気順(昇順)に並び替える
g<-ggplot(dat,aes(x=reorder(name,total),y=total))+geom_bar(stat="identity")
gX軸ラベルが変更されてしまったので直します.
g + labs(x="name")#人気順(降順)に並び替える
g<-ggplot(dat,aes(x=reorder(name,-total),y=total))+geom_bar(stat="identity")+labs(x="name")
g前述の人気名の人気推移を見てみます.
tbl <- data.frame(table(data$First.Name,data$Year))
colnames(tbl)<-c("name","year","count")#d <- tbl[tbl$name %in% c("EMMA","JACOB","LOGAN","OLIVIA","ISABELLA","SOPHIA","NOAH","MASON","ETHAN","AVA"),]
d <- tbl[tbl$name %in% dat$name,]g<-ggplot(d,aes(x=year,y=count,group=name,colour=name,shape=name))+geom_line()
gg<-g+geom_point()+scale_shape_manual(values = 1:10)
gtbl <- data.frame(table(data$First.Name,data$Year))
colnames(tbl)<-c("name","year","count")
tmp <- tbl[tbl$year==2007,]
d <- tmp[order(tmp$count,decreasing = TRUE),][1:10,]
tmp <- tbl[tbl$year==2008,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2009,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2010,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2011,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2012,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2013,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
g<-ggplot(d,aes(x=year,y=count,group=name,colour=name))+geom_line()
g<-g+geom_point(aes(shape=name))+scale_shape_manual(values = seq(from=1,to=length(unique(d$name))))
g2012年度のデータから,男女ともに用いられる名前,男女兼用名を集計します.
#2012年データの抽出
sub <- subset(data,Year==2012)#男性データの抽出
male <- sub[sub$Sex=="M",]
#女性データの抽出
female <- sub[sub$Sex=="F",]
#データの要約
summary(male)## Year First.Name County Sex
## Min. :2012 MASON : 45 KINGS : 359 F: 0
## 1st Qu.:2012 LIAM : 43 SUFFOLK : 261 M:3292
## Median :2012 JACOB : 37 QUEENS : 241
## Mean :2012 NOAH : 37 NASSAU : 237
## 3rd Qu.:2012 ALEXANDER: 33 WESTCHESTER: 194
## Max. :2012 JACKSON : 33 ERIE : 193
## (Other) :3064 (Other) :1807
## Count
## Min. : 5.0
## 1st Qu.: 7.0
## Median : 11.0
## Mean : 20.2
## 3rd Qu.: 21.0
## Max. :273.0
##
summary(female)## Year First.Name County Sex
## Min. :2012 SOPHIA : 44 KINGS : 384 F:2872
## 1st Qu.:2012 EMMA : 42 SUFFOLK : 300 M: 0
## Median :2012 OLIVIA : 37 NASSAU : 270
## Mean :2012 ISABELLA: 35 QUEENS : 244
## 3rd Qu.:2012 AVA : 30 WESTCHESTER: 226
## Max. :2012 ABIGAIL : 29 ERIE : 186
## (Other) :2655 (Other) :1262
## Count
## Min. : 5.00
## 1st Qu.: 6.00
## Median : 11.00
## Mean : 16.55
## 3rd Qu.: 18.00
## Max. :204.00
##
#名前をキーにCount列集計
m <- aggregate(male$Count,list(male$First.Name),sum)
names(m) <- c("name","cnt")
#名前をキーにCount列集計
f <- aggregate(female$Count,list(female$First.Name),sum)
names(f) <- c("name","cnt")
#データ確認(先頭3行だけ表示)
head(m[order(m$cnt,decreasing=TRUE),],n=3)## name cnt
## 367 MICHAEL 1317
## 230 JACOB 1289
## 251 JAYDEN 1211
head(f[order(f$cnt,decreasing=TRUE),],n=3)## name cnt
## 547 SOPHIA 1353
## 268 ISABELLA 1223
## 197 EMMA 1165
#名前が一致する(=男女兼用名)データのみ結合
tmp <- merge(m,f,by="name")
names(tmp) <- c("name","male","female")
#男性への命名数が多い順に並び替え
tmp[order(tmp$male,decreasing=TRUE),]## name male female
## 9 DYLAN 816 18
## 3 ANGEL 361 14
## 12 JORDAN 329 25
## 7 CAMERON 317 7
## 6 BLAKE 209 6
## 1 ALEXIS 70 119
## 16 RILEY 70 227
## 5 AVERY 46 302
## 4 ARIEL 44 75
## 2 AMARI 38 5
## 11 HAYDEN 29 14
## 18 TENZIN 29 25
## 13 PEYTON 26 128
## 10 EMERSON 13 12
## 14 PHOENIX 12 10
## 15 QUINN 10 43
## 8 CASEY 6 14
## 17 SKYLER 5 6
#パッケージの読み込み(データフレーム再構成用)
library(reshape2)
#男性への命名数が多い順に並び替え
tbl <- tmp[order(tmp$male,decreasing=TRUE),]
#名前をキーにデータ再構成
tbl <- melt(tbl,id="name")
#確認
head(tbl)## name variable value
## 1 DYLAN male 816
## 2 ANGEL male 361
## 3 JORDAN male 329
## 4 CAMERON male 317
## 5 BLAKE male 209
## 6 ALEXIS male 70
#列名の確認
names(tbl)## [1] "name" "variable" "value"
#横棒グラフの描画
g <- ggplot(tbl,aes(x=reorder(name,value),y=value,fill=variable))
g <- g +geom_bar(stat="identity")+coord_flip()
g <- g+labs(x="Unisex name")+ggtitle("Unisex names in 2012")
g#グラフ画像の保存
ggsave(filename="tmp.png",plot=g)## Saving 7 x 5 in image
#保存場所の確認
getwd()## [1] "/Users/mhaya/Documents/kougi/adv_h28"
「Baby Names: Beginning 2007」を用いて以下の条件のグラフを作成し,画像ファイルとして提出してください.グラフタイトルには自身の学籍番号を含めてください.
回答イメージ
回答イメージ
Masaharu Hayashi を著作者とするこの 作品 は クリエイティブ・コモンズの 表示 4.0 国際 ライセンスで提供されています。